/**
 * @file      : ap3216c.c
 * @brief     : AP3216C驱动源文件
 * @author    : huenrong (huenrong1028@gmail.com)
 * @date      : 2021-04-04 14:03:46
 *
 * @copyright : Copyright (c) 2021 胡恩荣
 *
 */

#include <stdio.h>
#include <unistd.h>

#include "./ap3216c.h"
#include "../i2c/i2c.h"

/**
 * @brief  AP3216C初始化
 * @return 成功: 0
 *         失败: -1
 */
int ap3216c_init(void)
{
    int ret = -1;
    uint8_t ap3216c_config = 0;

    ret = i2c_open(AP3216C_I2C_DEV_NAME);
    if (0 != ret)
    {
        return -1;
    }

    // 初始化ap3216c
    // 复位ap3216c
    ap3216c_config = SW_RESET;
    ret = i2c_write_data_sub(AP3216C_I2C_DEV_NAME, AP3216C_I2C_SLAVE_ADDR,
                             AP3216C_SYSTEM_CONFIG, &ap3216c_config, 1);
    if (-1 == ret)
    {
        return -1;
    }
    // 复位以后至少延时10ms
    usleep(20 * 1000);

    // 开启ALS、PS+IR
    ap3216c_config = ALS_PS_IR_FUNCTION_ACTIVE;
    ret = i2c_write_data_sub(AP3216C_I2C_DEV_NAME, AP3216C_I2C_SLAVE_ADDR,
                             AP3216C_SYSTEM_CONFIG, &ap3216c_config, 1);
    if (-1 == ret)
    {
        return -1;
    }
    // 配置后需要延时一段时间才生效
    usleep(350 * 1000);

    return 0;
}

/**
 * @brief  AP3216C读取数据
 * @param  read_ir_data : 输出参数, 读取到的ir数据
 * @param  read_als_data: 输出参数, 读取到的als数据
 * @param  read_ps_data : 输出参数, 读取到的ps数据
 * @return 成功: 0
 *         失败: -1
 */
int ap3216c_read_data(uint16_t *read_ir_data, uint16_t *read_als_data,
                      uint16_t *read_ps_data)
{
    int ret = -1;
    uint8_t read_data[6] = {0};

    // 循环读取所有传感器数据
    for (uint8_t i = 0; i < 6; i++)
    {
        ret = i2c_read_data_sub(&read_data[i],
                                AP3216C_I2C_DEV_NAME, AP3216C_I2C_SLAVE_ADDR,
                                (AP3216C_IR_DATA_LOW + i), 1);
        if (-1 == ret)
        {
            printf("ao3216c read data fail\n");
        }
    }

    // IR_OF位为1,则数据无效
    if (read_data[0] & 0x80)
    {
        *read_ir_data = 0;
    }
    // 获取IR传感器的数据
    else
    {
        *read_ir_data = (uint16_t)((read_data[1] << 2) |
                                   (read_data[0] & 0x03));
    }

    // 获取ALS传感器的数据
    *read_als_data = (uint16_t)((read_data[3] << 8) | read_data[2]);

    // PS_OF位为1,则数据无效
    if (read_data[4] & 0x40)
    {
        *read_ps_data = 0;
    }
    // 获取PS传感器的数据
    else
    {
        *read_ps_data = (uint16_t)(((read_data[5] & 0x3F) << 4) |
                                   (read_data[4] & 0x0F));
    }

    return 0;
}
